<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>
        'use strict'
        // 1.严格模式下变量的变化
        // (1).变量不允许直接赋值,须声明后赋值
        //   num = 10;//报错 未定义defined
        // var num = 20
        // console.log(num);//20

        // (2).不允许随意删除定义好的变量 (delete=删除)
        // delete num;//报错 


        // 2.严格模式下this指向(普通模式下全局作用域函数内this指向window 没有其他调用的前提下)
        // (1)严格模式下全局作用域函数内的this指向undefined
        // function fn() {
        //     console.log(this);
        // }
        // fn()
        // (2).严格模式下如果构造函数不加new调用,this指向的是undefined 如果给他赋值 则报错 (普通模式下this指向全局对象 )
        // function Star() {
        //    this.sex = '男'
        // }
        // Star()//报错 
        // (3). new实例化的构造函数this指向创建的对象实例
        // var ldh =  new Star()
        // (4).严格模式下 定时器还是指向window 和普通模式一样 事件/对象还是指向调用者
        // setTimeout(function() {
        //    console.log(this);//window
        // },2000)

        //3.严格模式下函数的参数不允许重名(普通模式可以输出但是结果不准 下面会演示)
        // function fun(a, a) {
        //     console.log(a + a);
        // }
        // fun(1, 2)//报错
        //扩展:普通模式下演示函数参数重名的执行过程
        // a = 1
        // a = 2
        // //就近层叠a = 2 那么2+2 = 4
        // function f(a, a) {
        //     console.log(a + a);
        // }
        // f(1, 2)

        // 4.严格模式下函数不允许在非函数的代码块内声明函数(例如函数不可以在for/if里嵌套) 但是可以函数嵌套(函数里面写函数)同样的合法

        // if (true) {
        //     function f() {
        //         console.log(1);
        //     }
        // }//严格模式下不可以这么写

        // for (var i = 0; i < arr.length; i++) {
        //     function ff() {
        //     }
        // }//不可以这么写



    </script>
</body>

</html>